using MediatR;
using WMS.Domain;
using WMS.ErrorCode;
using WMS.Infrasturcture.Interfaces;
using WMS.WebApiWrite.Application.Command;

namespace WMS.WebApiWrite.Application.Commandhandler
{
    /// <summary>
    /// 处理 <see cref="UpdateStoragelocationInfoCommand"/> 修改库位信息命令的处理器
    /// </summary>
    public class UpdateStoragelocationInfoCommandHandler : IRequestHandler<UpdateStoragelocationInfoCommand, ApiResult<bool>>
    {
        private readonly IBaseRepository<StoragelocationInfo> storagelocationRepository;

        /// <summary>
        /// 构造函数，注入库位信息仓储
        /// </summary>
        /// <param name="storagelocationRepository">库位信息仓储接口</param>
        public UpdateStoragelocationInfoCommandHandler(IBaseRepository<StoragelocationInfo> storagelocationRepository)
        {
            this.storagelocationRepository = storagelocationRepository;
        }

        /// <summary>
        /// 处理 <see cref="UpdateStoragelocationInfoCommand"/> 修改库位信息命令
        /// </summary>
        /// <param name="request">命令请求</param>
        /// <param name="cancellationToken">取消令牌</param>
        /// <returns>返回操作结果</returns>
        public async Task<ApiResult<bool>> Handle(UpdateStoragelocationInfoCommand request, CancellationToken cancellationToken)
        {
            try
            {
                // 验证库位编号是否存在
                if (!request.StoragelocationDTO.StoragelocationId.HasValue)
                {
                    return new ApiResult<bool>
                    {
                        Code = ApiResultEnum.修改失败,
                        Message = "库位编号不能为空",
                        Data = false
                    };
                }

                // 查找要修改的库位信息（只查询未删除的数据）
                var storagelocationInfo = storagelocationRepository.GetAll()
                    .Where(x => !x.IsDeleted) // 只查询未删除的记录
                    .FirstOrDefault(x => x.StoragelocationId == request.StoragelocationDTO.StoragelocationId.Value);

                if (storagelocationInfo == null)
                {
                    return new ApiResult<bool>
                    {
                        Code = ApiResultEnum.修改失败,
                        Message = "库位信息不存在",
                        Data = false
                    };
                }

                // 注意：库位编码由系统自动生成，修改时不允许更改
                // 更新库位信息（不更新库位编码和删除标记）
                storagelocationInfo.StoragelocationName = request.StoragelocationDTO.StoragelocationName;
                storagelocationInfo.StoragelocationCapacity = request.StoragelocationDTO.StoragelocationCapacity;
                storagelocationInfo.StoragelocationState = request.StoragelocationDTO.StoragelocationState;
                storagelocationInfo.StoragelocationContent = request.StoragelocationDTO.StoragelocationContent;
                storagelocationInfo.StoragelocationScore = request.StoragelocationDTO.StoragelocationScore;
                storagelocationInfo.SupervisorId = request.StoragelocationDTO.SupervisorId;
                storagelocationInfo.DataStatus = request.StoragelocationDTO.DataStatus; // 更新数据状态
                storagelocationInfo.UpdateName = request.StoragelocationDTO.OperatorName;
                storagelocationInfo.UpdateTime = DateTime.Now;

                // 执行修改操作
                var result = await storagelocationRepository.UpdateAsync(storagelocationInfo);

                if (result > 0)
                {
                    return new ApiResult<bool>
                    {
                        Code = ApiResultEnum.修改成功,
                        Message = "修改库位信息成功",
                        Data = true
                    };
                }
                else
                {
                    return new ApiResult<bool>
                    {
                        Code = ApiResultEnum.修改失败,
                        Message = "修改库位信息失败",
                        Data = false
                    };
                }
            }
            catch (Exception ex)
            {
                return new ApiResult<bool>
                {
                    Code = ApiResultEnum.修改失败,
                    Message = $"修改库位信息异常：{ex.Message}",
                    Data = false
                };
            }
        }
    }
}

